package cn.lzy.study.datasource.datasource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * 【动态多数据源切换功能实现-核心点】
 * 当 mapper 需要获取数据源时，会去 AbstractRoutingDataSource 类中进行处理
 * @author LZY
 * @since 2022-08-11
 */
@Component
public class DynamicDataSource extends AbstractRoutingDataSource {


    public DynamicDataSource(LoadDataSource loadDataSource) {
        // 1.设置所有的数据源（作用：将来获取到需要调用的数据源名称后，会来到该目标数据中进行获取需要调用的数据源）
        Map<String, DataSource> allDataSourceMap = loadDataSource.loadAllDataSource();
        super.setTargetDataSources(new HashMap<>(allDataSourceMap));

        // 2.设置默认数据源（作用：并不是所有的方法上都有 @DataSource 注解，对于那些没有 @DataSource 注解的方法，设置使用默认数据源）
        super.setDefaultTargetDataSource(allDataSourceMap.get(DataSourceType.DEFAULT_DS_NAME));

        // 3
        super.afterPropertiesSet();
    }



    /**
     * 该方法用来返回数据源名称
     * （当系统需要获取数据源的时候，会自动调用该方法获取数据源的名称）
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSourceType();
    }
}
